home *** CD-ROM | disk | FTP | other *** search
- #include "PICS_Merge.h"
- #include "PICS_Types.h" // Creator, file types
- #include "PICS_Info.h" // Handle PICS' "INFO" resource
- #include "PICS_Utils.h"
-
- #include "PICS_Operations.h"
- #include "Class_ProgressWindow.h"
- #include "FileRegistry.h"
- #include "ReadPicture.h" // To read in PICT files
- #include "Select Multiple Files.h" // To add PICT files in any order
- #include "StringUtils.h" // Append, manipulate filenames
- #include "Monitors.h"
-
- #include "main.h" // For AppEmergencyUpdate()
-
- #include "SimpleError.h" // For error-handling
- #include "assert_mac.h"
-
- // ---------------------------------------------------------------------------
-
- void SetupMergePICTFiles(short numFiles, FSSpec *pictFile) {
- FSSpec *fileList;
- OSType creatorTypePICS;
-
- creatorTypePICS = kPICSiliciousCreatorType;
-
- if (numFiles == 0) {
- // We select file to merge via a customized get file dialog box...
- // When done, SelectPICTFilesToMerge will have allocated an array
- // of FSSpec's for us. It is up to the caller to dispose of this
- // array...
- SelectPICTFilesToMerge(&numFiles, &fileList);
- AppEmergencyUpdate();
-
- if (numFiles > 1) {
- MergePICTFiles(numFiles, fileList,
- creatorTypePICS, "\pMerged PICS");
- DisposePtr((Ptr)fileList);
- }
- else if (numFiles == 1) {
- SimpleError(kAlertErrID, kErrMsgID, kNeedMoreFilesErrMsg);
- return;
- }
- }
- else {
- // We got our files via drag and drop.
- fileList = pictFile;
-
- // Check all files to make sure they're PICT files
- FInfo fileInfo;
- OSErr myErr;
- for (short i = 0; i < numFiles; i++) {
- myErr = FSpGetFInfo(&fileList[i], &fileInfo);
- if (myErr == noErr && fileInfo.fdType != kPICTFileType) {
- SimpleError(kAlertErrID, kErrMsgID, kDontAcceptPICSFileErrMsg);
- return;
- }
- }
-
- if (numFiles == 1) {
- SimpleError(kAlertErrID, kErrMsgID, kNeedMoreFilesErrMsg);
- return;
- }
-
- MergePICTFiles(numFiles, fileList,
- creatorTypePICS, "\pMerged PICS");
- }
- } // END SetupMergePICTFiles
-
- // ---------------------------------------------------------------------------
-
- void MergePICTFiles(
- short numFiles,
- FSSpec *fileList,
- OSType creator,
- Str31 fileName) {
-
- StandardFileReply reply;
- OSErr myErr;
- short fileRefNum;
- short oldRefNum;
-
- // Put up the standard save dialog
- StandardPutFile("\pSave merged PICS into:", fileName, &reply);
-
- if (reply.sfGood) {
- if (reply.sfReplacing) {
- myErr = FSpDelete(&reply.sfFile);
- if (myErr != noErr) {
- return;
- }
- }
-
- AppEmergencyUpdate();
- oldRefNum = CurResFile();
-
- // Create the file.
- FSpCreateResFile(&reply.sfFile, creator, kPICSFileType1, reply.sfScript);
- if (ResError() != noErr) {
- return;
- }
-
- fileRefNum = FSpOpenResFile(&reply.sfFile, fsRdWrPerm);
- if (fileRefNum != -1 || !RegisterFile(fileRefNum)) {
- short picDepth = 0;
- long picSize, largestPicSize;
- PicHandle picHandle;
-
- ProgressWindowPtr progressWindow = new ProgressWindow(GetDeepestDevice(), numFiles);
- SetPort(progressWindow->GetWindow());
- TextFont(geneva);
- TextSize(9);
- TextFace(bold);
- progressWindow->SetPrimaryMessage("\pMerging PICT file:");
-
- UseResFile(fileRefNum);
-
- SetCursor(*GetCursor(watchCursor));
- largestPicSize = 0;
- for (short i = 0, idStart = kPICSRsrcStartID; i < numFiles; i++, idStart++) {
- progressWindow->SetSecondaryMessage(fileList[i].name);
- progressWindow->Increment();
-
- picHandle = ReadPicture(&fileList[i]);
-
- if (picHandle != NULL) {
- if (i == 1) // We need to get depth only once
- picDepth = GetPictDepth(picHandle);
-
- picSize = GetHandleSize((Handle)picHandle);
- if (picSize > largestPicSize)
- largestPicSize = picSize;
-
- UseResFile(fileRefNum);
- AddResource((Handle)picHandle, kPICSRsrcType, idStart, "\p");
- WriteResource((Handle)picHandle);
- ReleaseResource((Handle)picHandle);
- }
- else {
- delete progressWindow;
- UseResFile(oldRefNum);
- SimpleError(kAlertErrID, kErrMsgID, kUnableLoadPICTFileErrMsg);
- CloseResFile(fileRefNum);
- return;
- }
- }
- progressWindow->SetPrimaryMessage("\pDone.");
- progressWindow->FinishProgress();
- delete progressWindow;
-
- PICSInfoRsrcHdl picsInfo;
- picsInfo = NewPICSInfoResource();
- ASSERT(picsInfo != NULL);
- if (picsInfo != NULL) {
- (**picsInfo).speed = kDefaultPICSSpeed;
- (**picsInfo).creatorType = kPICSiliciousCreatorType;
- (**picsInfo).largestFrameSize = largestPicSize;
- (**picsInfo).depth = picDepth;
-
- if (!SavePICSInfo(picsInfo, true)) {
- // ERROR HANDLING
- }
- DisposePICSInfo(picsInfo);
- }
-
- (void)UnregisterFile(fileRefNum);
- CloseResFile(fileRefNum);
- UseResFile(oldRefNum);
- SetCursor(&qd.arrow);
- }
- }
- } // END MergePICTFiles
-